import Axios from 'axios';
import qs from 'qs';
import { Notification } from 'element-ui';
// Axios.defaults.withCredentials = true;

//获取BaseUrl。优先级：baseUrl>不同项目启动环境的baseUrl
function getBaseUrl(baseUrl) {
  if (baseUrl !== null && baseUrl !== undefined) {
    return;
  }
  return process.env.VUE_APP_BASE_URL;
}

//创建请求实例，可配置实例属性的默认值
const request = Axios.create({
  timeout: 1000,
  withCredentials: true,
});

//默认post是'application/x-www-form-urlencoded'，这里指定post使用json编码
request.defaults.headers.post['Content-Type'] = 'application/json';
request.defaults.headers.Authorization = window.sessionStorage.getItem('token');
//为实例添加请求拦截器(config是在外部调用实例时，传入的配置，这个配置优先级高于create中的配置；请求拦截器里return的结果就是发起请求的配置)
request.interceptors.request.use(
  (config) => {
    //
    config.baseURL = getBaseUrl(config.baseURL);

    //给config的headers增加新的字段Authorization，把token添加进去
    config.headers['Authorization'] = window.sessionStorage.getItem('token');
    //axios中默认使用data作为post请求的参数，params作为get请求的参数。这里统一处理为传入data参数
    if (config.method === 'get') {
      config.params = config.data;
      delete config.data;
      //paramsSerializer是一个负责 `params` 序列化的函数
      config.paramsSerializer = (params) => {
        //{ a: ['b', 'c']} 转化为 a=b&a=c
        //qs库文档：https://www.npmjs.com/package/qs
        return qs.stringify(params, { arrayFormat: 'repeat' });
      };
    } else {
      //post、put等其他请求还是用data
    }

    return config;
  },
  (error) => {
    return Promise.reject(error);
  }
);

//为实例添加响应拦截器(与响应拦截器里return的结果都是外部调用实例的Promise的结果)
request.interceptors.response.use(
  (response) => {
    const {
      data: { code, msg, data: businessData },
    } = response;
    //这里做业务处理
    if (
      response.headers['content-type'].includes('application/json;') &&
      code !== 0
    ) {
      Notification.error({
        title: '错误',
        message: msg || '未知业务错误',
      });
      return Promise.reject(new Error(msg || '未知业务错误'));
    } else {
      return businessData;
    }
  },
  (error) => {
    //响应出错，返回的就是个error对象了。如果正常响应但是状态码不是200也会走到这里面，返回的就是成功里的config结构
    console.log('这里是响应出错的error', error);

    return Promise.reject(error);
  }
);

export default request;
